package com.atguigu.lease.common.context;

public class LoginUserContext {
    //我们在这里定义一个线程本地变量，用来存储登录用户信息
    //这样子我们只需要在拦截用户登录请求，并且登录成功的时候，将解析的token经过处理将有用的数据保存到线程本地变量中
    //这样就避免了我们在登录成功后，后续方法--‘获取登录成功的用户的个人信息’ 中，去再次解析token
    //造成多次解析token的问题
    private static final ThreadLocal<LoginUser> userThreadLocal = new ThreadLocal<>();

    public static void setLoginUser(LoginUser loginUser) {
        userThreadLocal.set(loginUser);
    }

    public static LoginUser getLoginUser() {
        return userThreadLocal.get();
    }
    //清空线程本地变量中的数据
    // why？ ： 因为SpringMVC中的线程池是复用的，举个例子
    // 当有一个A用户它访问了登录接口，登录成功后，会将解析好的token保存到线程本地变量中，
    // 这时候如果B用户也进来访问，那么此时如果我们不做清空线程本地变量的操作的话
    // 那么B用户访问的时候，会将A用户的token信息取出来，导致B用户也拥有了A用户的权限，这是非常不安全的。
    public static void clear() {
        userThreadLocal.remove();
    }
}